package com.gopay.remote.solution;

import java.util.List;

import com.gopay.common.exception.GopayException;
import com.gopay.remote.solution.vo.SsApSolution;
import com.gopay.remote.solution.vo.SsPlTranSolution;
import com.gopay.remote.solution.vo.SsTranBasicSolution;
import com.gopay.remote.solution.vo.SsTranLegalObjSolution;
import com.gopay.remote.solution.vo.SsTransLimitConfInfo;

/**
 * 方案管理远程接口
 * 
 * @SolutionManageRemoteService.java
 * @author MA HUAN
 * @2013-4-1 下午4:21:20 www.gopay.com.cn Inc.All rights reserved.
 */
public interface SolutionManageRemoteService {

	/**
	 * 根据账户产品代码：查询账户产品交易信息
	 * 
	 * 查询产品产品与方案关系表中账户产品代码为acctProdCode方案类型为TRN（交易方案）的方案id(1:1)
	 * 根据方案id，查询交易方案表(SsTransSolution)，获取与明细表关联的id（目前此id就是上述id）
	 * 根据id查询明细表信息，方案表与明细表1:N，使用id关联
	 * 
	 * @return
	 */
	List<SsApSolution> findAllAPTransSolution();

	/**
	 * 查询特定产品可用交易信息
	 * 
	 * @param acctProdCode
	 * @return
	 */
	SsApSolution findAPTransSolution(String acctProdCode);

	/**
	 * ui-config
	 * 
	 * @param acctProdCode
	 * @return
	 */
	SsApSolution findAPUIConfigSolution(String acctProdCode);

	/**
	 * 查询特定账户产品指定交易手续费方案信息
	 * 
	 * @param acctProdCode
	 * @param gopayIntTxnCd
	 * @return
	 */
	SsApSolution findAPFeeSolution(String acctProdCode, String gopayIntTxnCd);

	/**
	 * 查询特定账户产品指定交易清算渠道方案信息
	 * 
	 * @param acctProdCode
	 * @param gopayIntTxnCd
	 * @return
	 */
	SsApSolution findAPPayChannSolution(String acctProdCode,
			String gopayIntTxnCd);

	/**
	 * 查询特定账户产品账户收益方案信息
	 * 
	 * @param acctProdCode
	 * @param gopayIntTxnCd
	 * @return
	 */
	SsApSolution findAPGainSolution(String acctProdCode);

	/**
	 * 平台不存在的产品代码，，校验失败 平台存在的产品代码： 1- 交易码参数为空 关系表存在：删关系表，删方案表，删明细表 关系吧不存在：直接返回成功
	 * 
	 * 2- 关系表中不存在的账户产品代码 (prodCode+TRN) 创建游离关系对象，solutionType=TRN，solutionId待定
	 * 创建游离solution对象，设置上述关系solutionId为此id 创建游离dtl对象 依次保存
	 * 
	 * 3- 关系表中存在的账户产品代码，但solution不存在关联对象，不会出现的情况
	 * 如果出现此种情况，save一个新的solution，save明细
	 * 
	 * 4- 关系表中存在的账户产品代码，solution存在关联对象，但明细表无记录 创建游离dtl对象 依次保存
	 * 
	 * 5- 关系表中存在的账户产品代码，solution存在关联对象，明细表存在记录 查询明细记录，用户上传的交易码存在对应记录，更新
	 * 否则创建游离对象保存 多余的明细记录，删。
	 * 第5种情况，同一事物里面进行：相关明细表(solutionId已知)全删，然后创建游离明细对象，再save
	 * 
	 * @param acctProdCode
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyApTransSolution(SsApSolution ssApSolution);

	/**
	 * 手续费方案设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyApFeeSolution(SsApSolution ssApSolution, String gopayIntTxnCd);

	/**
	 * 清算渠道方案设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyApPayChannSolution(SsApSolution ssApSolution,
			String gopayIntTxnCd);

	/**
	 * 收益方案设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyApGainSolution(SsApSolution ssApSolution);
	
	/**
	 * 佣金方案设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyGpComSolution(SsApSolution ssApSolution);
	/**
	 * 风险金方案设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyGpRskSolution(SsApSolution ssApSolution);

	/**
	 * uiconfig设置
	 * 
	 * @param ssApSolution
	 * @param gopayIntTxnCd
	 * @return
	 */
	String modifyApUIConfigSolution(SsApSolution ssApSolution);

	List<SsPlTranSolution> findPlTransSolutionByPlId(List<String> prodLineIds);

	String savePlTransSolution(SsPlTranSolution ssPlTransSolution);

	String editPlTransSolution(SsPlTranSolution ssPlTransSolution);

	SsTranBasicSolution findTbSoluByApCodeAndIntTxnCd(String acctProdCode,
			String gopayIntTxnCd);

	String editTbSoluByIntTxnCd(SsTranBasicSolution solution,
			String gopayIntTxnCd);

	String saveTbSoluByIntTxnCd(SsTranBasicSolution solution,
			String acctProdCode, String gopayIntTxnCd);

	SsTranLegalObjSolution findTloSoluByApCodeAndIntTxnCd(String apCode,
			String gopayIntTxnCd);

	String editLoSoluByIntTxnCd(SsTranLegalObjSolution solution,
			String gopayIntTxnCd);

	String saveLoSoluByIntTxnCd(SsTranLegalObjSolution solution,
			String acctProdCode, String gopayIntTxnCd);

	SsTranBasicSolution findTranBasicSoluByProdCode(String acctProdCode);

	/**
     * 特定银行指定付款通道是否使用
     * @param bankCode
     *          银行码
     * @param channel
     *          支付通道：1-B2C，2-B2B，3-B2C&B2B
     * @return
     * 使用 true，否则false
     */
    boolean isBankChannelUsed(String bankCode, String channel);
    
    
    /**
     * 查询客户账户产品额度配置
     * @return
     */
    public List<SsApSolution>  queryAccountLimit(String custId);
    
    
    /**
     * 查询账户产品额度配置
     * @return
     */
    public List<SsApSolution>  queryAccountProLimit();
    
   /**
    * 查询特定账户产品额度配置
    * @param bankCode
    * @param channel
    * @return
    */
    public SsApSolution queryAccountProLimitBySoluId(String solutionId);
    
    
    /**
     * 查询特定客户账户产品额度配置
     * @param bankCode
     * @param channel
     * @param today(格式yyyyMMdd)
     * @return
     */
     public SsApSolution queryActLimitByProdCode(String custId,String prodCode,String today);
     
 	 public List<SsApSolution> queryActLimit(String custId);
    /**
     * 设置账户产品额度配置
     * @return
     */
    public String   modifyAccountProLimit(SsApSolution ssApSolution);
    /**
     * 查询特定账户产品额度配置
     * @param bankCode
     * @param channel
     * @param today(格式yyyyMMdd)
     * @return
     */
     public SsApSolution queryProLimitByProdCode(String prodCode);
    
    /**
     * 设置客户账户产品额度配置
     * @return
     */
    public String   modifyAccountLimit(SsApSolution ssApSolution,String custId)  ;
    /**
     * 查询账户产品额度配置明细
     * @param bankCode
     * @param channel
     * @return
     */
    public SsTransLimitConfInfo findSolutionDtl(Long sq);
    
    /**
     * 修改账户产品额度配置明细
     * @param bankCode
     * @param channel
     * @return
     */
    public SsTransLimitConfInfo modifySolutionDtl(SsTransLimitConfInfo info)throws GopayException;
    
    /**
     * 佣金方案设置
     * 
     * @param ssApSolution
     * @param gopayIntTxnCd
     * @return
     */
    String modifyGpComConfSolution(SsApSolution ssApSolution,
            String solutionType);
    /**
     * 风险金方案设置
     * 
     * @param ssApSolution
     * @param gopayIntTxnCd
     * @return
     */
    String modifyGpRiskFundConfSolution(SsApSolution ssApSolution,
            String solutionType);
    
    /**
     * 查询特定账户产品风险金方案信息
     * 
     * @param acctProdCode
     * @param gopayIntTxnCd
     * @return
     */
    SsApSolution findAPGpRiskFundSolutionByProdCode(String acctProdCode);
    /**
     * 查询特定账户产品佣金方案信息
     * 
     * @param acctProdCode
     * @param gopayIntTxnCd
     * @return
     */
    SsApSolution findAPGpComSolutionByProdCode(String acctProdCode);
    

    /**
     * 查询特定账户产品指定交易返润方案信息
     * 
     * @param acctProdCode
     * @param gopayIntTxnCd
     * @return
     */
    SsApSolution findApProfitSolution(String acctProdCode, String intTxnCd);
    

    /**
     * 返润方案设置
     * 
     * @param ssApSolution
     * @param gopayIntTxnCd
     * @return
     */
    String modifyApProfitSolution(SsApSolution ssApSolution, String intTxnCd);
    
    

    /**
     * 查询特定账户产品指定交易结算方案信息
     * 
     * @param acctProdCode
     * @param gopayIntTxnCd
     * @return
     */
    SsApSolution findApSettleSolution(String acctProdCode, String intTxnCd);
    

    /**
     * 结算方案设置
     * 
     * @param ssApSolution
     * @param gopayIntTxnCd
     * @return
     */
    String modifyApSettleSolution(SsApSolution ssApSolution, String intTxnCd);

}